#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_gpio.h"
#include "./stm32f401_pico_led.h"
#include "./stm32f401_pico_uart.h"
#include <stdio.h>
#include <string.h>

TaskHandle_t key_task_handle = NULL;  // 按键检测任务句柄
uint8_t key_state = 0;                // 按键状态（0：未按下，1：按下）
uint32_t key_last_press = 0;          // 上次按键时间（用于消抖）
volatile int led = 0;
uint8_t last_led_state = 0;            // 记录上一次led状态（用于避免重复操作）
uint32_t key_press_count = 0;          // 按键按下次数计数器
char key_status_str[30];  

// GPIO初始化：同时配置PC13（LED）和PA0（按键）
static void KEY_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 使能GPIOA和GPIOC时钟（PA0在GPIOA）
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 初始化PA0（按键）：输入模式，上拉（假设按键按下接GND，未按下时由上拉保持高电平）
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;  // 上拉输入（根据硬件电路调整，若有外部上拉可设为NOPULL）
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* 配置EXTI中断 */
    HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 1);
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

/* EXTI0中断处理函数 */
void EXTI0_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    //消抖
    vTaskDelay(pdMS_TO_TICKS(20));
    
    if(GPIO_Pin == GPIO_PIN_0)
    {
        led = (led + 1) % 2; // 更新LED状态
        key_press_count++; 
    }
}

//记录按键按下次数
// void check_key_press(void)
// {
//     sprintf(key_status_str, "按键按下的次数为：%lu", key_press_count);
// }

// 按键检测任务：检测PA0状态并控制任务1的暂停/继续
void Key_Task(void *pvParameters)
{
    printf("任务开始2\r\n");
    KEY_GPIO_Init();
    last_led_state = led;  // 初始化上次状态

    while (1) {
        // 检测led状态变化（仅在状态改变时执行操作）
        if (led != last_led_state) {
            if (led == 1) {
                // 当led为1时，恢复LED任务（如果已挂起）
                if (led_task_handle != NULL) 
                {
                    vTaskResume(led_task_handle);
                    printf("LED任务make已继续运行\r\n");
                }
            } else {
                // 当led为0时，挂起LED任务（如果在运行）
                if (led_task_handle != NULL) 
                {
                    vTaskSuspend(led_task_handle);
                    printf("LED任务已停止\r\n");
                }
            }
            last_led_state = led;  // 更新上次状态
        }


        vTaskDelay(10);  // 降低检测频率，减少CPU占用
    }
}
